本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:
更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。
讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看
今天也是先把簡單的處理完,今天來製作,刪除動物功能。
Method | URI | Name | Action | Middleward |
---|---|---|---|---|
DELETE | api/animal/{animal} | anumal.destroy | App\Http\Controllers\AnimalController@destroy | api |
用 HTTP DELETE 動詞請求 api/animal/1 表示刪除 id 為 1 的動物資料。
AnimalController
// 路由有設定 animal 變數,這裡設定它是 Animal 模型,所以會自動找出該ID的實體物件
public function destroy(Animal $animal)
{
// 把這個實體物件刪除
$animal->delete();
// 回傳 null 並且給予 204 狀態碼
return response(null, Response::HTTP_NO_CONTENT);
}
完成!簡單吧!補充一下返回的response 通常我都怎麼寫的。
我都是這樣做
有找到資料,然後刪除成功,我會回傳狀態碼 204 (No Content)
的回應
可能有些需要由後端處理,檔案比較大或系統流量大,不想要讓使用者等,可以先回傳 202 (Accepted)
表示你的請求,伺服器有收到,排隊等待處理中還沒有被執行,讓前端介面有對應的處理方式不需要等待,提升使用者體驗。
如果找不到資源 回傳 404 Not Found
打開 Postman 動作改為 DELETE
Headers 如下圖顯示即可
按下Send animals資料表原本有一筆資料就會被刪除囉!
如果這時候再送一次請求呢?
再送一次請求以後發現出現錯誤了 QQ
我們來處理一下這個異常
/animal/app/Exceptions/Handler.php
public function render($request, Exception $exception)
{
// 讓它顯示一下是哪一個異常狀況
dd($exception);
return parent::render($request, $exception);
}
在render 方法中 加入 dd($exception)
讓他印出異常,Postman 再送一次請求
發現是 ModelNotFoundException
這個例外,我們來攔截這個異常
因為ID:1 的內容已經不存在資料表了,導致出現狀況
把攔截錯誤的程式碼寫在 render
方法中(原本印出異常的程式碼 dd($exception);
可以刪掉)
use Illuminate\Database\Eloquent\ModelNotFoundException;
public function render($request, Exception $exception)
{
if ($request->expectsJson()) {
if ($exception instanceof ModelNotFoundException) {
return response()->json(
[
'error' => '找不到資源'
],
Response::HTTP_NOT_FOUND
);
}
}
return parent::render($request, $exception);
}
程式碼解釋,使用者請求回傳JSON 格式,發現有錯誤 ModelNotFoundException
被拋出,因為Model 沒有抓到資料,回傳 404 Not Found 並附上錯誤資訊。
再送一次相同請求!如下圖表示成功囉!
此篇文章同步發到個人部落格
use use Illuminate\Database\Eloquent\ModelNotFoundException;
這段多了一個use
謝謝你
想請問大大
在Laravel 8 的架構下
Handler 的架構也不太一樣
直接加入Render function會報出不少錯誤
爬了一下文檔 好像要用renderable 寫在 register function裡面
但似懂非懂 不太曉得怎麼實作出大大這個效果
還有一個新手問題
為什麼有好多的use要自己加
而Laravel沒有先預設好
還是這也是因為版本的差別
Laravel 8版本已經將這邊改版了!
Handler檔案預設沒有寫好render方法覆寫父類別
可以查看父類別的內容,將render方法複製過來
並且使用use 呼叫需要的類別
建議可以增加一些物件導向的設計模式
use 用於引用各種需要使用的類別或介面...